// TOP SECRET
/*
 * Copyright 2006-2015 Transsion.com All right reserved. This software is the confidential and proprietary information
 * of Transsion.com ("Confidential Information"). You shall not disclose such Confidential Information and shall use it
 * only in accordance with the terms of the license agreement you entered into with Transsion.com.
 */
package com.yunji.framework_template.common.util;

import java.net.InetAddress;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

/**
 * ClassName:IPHelper <br/>
 * Date: 2015年7月19日 下午5:50:26 <br/>
 * 
 * @author fenglibin
 * @version
 * @see
 */

public class IPHelper {

    /**
     * 知识的补充 InetAddress 继承自 java.lang.Object类 它有两个子类：Inet4Address 和 Inet6Address 此类表示互联网协议 (IP) 地址。 IP 地址是 IP 使用的 32 位或
     * 128 位无符号数字， 它是一种低级协议，UDP 和 TCP 协议都是在它的基础上构建的。 ************************************************
     * 主机名就是计算机的名字（计算机名），网上邻居就是根据主机名来识别的。 这个名字可以随时更改，从我的电脑属性的计算机名就可更改。 用户登陆时候用的是操作系统的个人用户帐号，这个也可以更改，
     * 从控制面板的用户界面里改就可以了。这个用户名和计算机名无关。
     */

    /**
     * 获取本机的IP
     * 
     * @return Ip地址
     */
    public static String getLocalHostIP() {
        String ip;
        try {
            /** 返回本地主机。 */
            InetAddress addr = InetAddress.getLocalHost();
            /** 返回 IP 地址字符串（以文本表现形式） */
            ip = addr.getHostAddress();
        } catch (Exception ex) {
            ip = "";
        }

        return ip;
    }

    /**
     * 或者主机名：
     * 
     * @return
     */
    public static String getLocalHostName() {
        String hostName;
        try {
            /** 返回本地主机。 */
            InetAddress addr = InetAddress.getLocalHost();
            /** 获取此 IP 地址的主机名。 */
            hostName = addr.getHostName();
        } catch (Exception ex) {
            hostName = "";
        }

        return hostName;
    }

    /**
     * 获得本地所有的IP地址
     * 
     * @return
     */
    public static String[] getAllLocalHostIP() {

        String[] ret = null;
        try {
            /** 获得主机名 */
            String hostName = getLocalHostName();
            if (hostName.length() > 0) {
                /** 在给定主机名的情况下，根据系统上配置的名称服务返回其 IP 地址所组成的数组。 */
                InetAddress[] addrs = InetAddress.getAllByName(hostName);
                if (addrs.length > 0) {
                    ret = new String[addrs.length];
                    for (int i = 0; i < addrs.length; i++) {
                        /** .getHostAddress() 返回 IP 地址字符串（以文本表现形式）。 */
                        ret[i] = addrs[i].getHostAddress();
                    }
                }
            }

        } catch (Exception ex) {
            ret = null;
        }

        return ret;
    }

    /**
     * 根据请求获取IP地址
     * 
     * @param request
     * @return
     */
    public static String getIpAddr(HttpServletRequest request) {
        try {
            String ip = request.getHeader("X-Real-IP");
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("x-forwarded-for");
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
            if (!StringUtil.isEmpty(ip)) {
                ip = ip.split(",")[0];
            }
            return ip;
        } catch (Exception e) {
            return null;
        }
    }

    public static String getRemoteIP() {
        String ip = null;
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            ip = request.getHeader("X-Real-IP");
            if (ip == null) {
                ip = request.getRemoteAddr();
            }
        } catch (Exception e) {
            ip = "127.0.0.1";
        }
        return ip;
    }
}
